package Top_Interview_Questions.Stack;

import java.util.Stack;

/**
 * @Author: 吕庆龙
 * @Date: 2020/1/6 16:05
 * <p>
 * 功能描述:
 */
public class _0020 {
    public static void main(String[] args) {
        String s = "()[]{}";
        System.out.println(isValid1(s));
    }
    /**
     * 第一遍解题: 2020/1/6 16:05
     *
     * 解析:
     *
     * 1.那个地方注意 (stack.empty() || c != stack.pop())这个地方的书写。
     *   a.正确写法: (stack.empty() || c != stack.pop())
     *   b.错误写法: (c != stack.pop() || stack.empty())
     *   c.原因:
     *     c-1.如果c != stack.pop()写前面,如果此时栈为空,会报EmptyStackException。
     *     c-2.如果栈只剩一个元素了,c != stack.pop()判定为false,此时最后一个元素已经
     *     被pop出来了,那么你再判断stack.empty()必定为true。肯定会进if,但实际情况是
     *     不进if。
     *   d.加stack.empty()的原因是防止类似这种情况 "]" 。
     * 2.在这里判断stack.empty()的目的:防止类似这种情况 "(){}[" 。就是循环结束了,stack还
     * 留了一个元素,这种情况显然是不符合的。
     */
    public static boolean isValid1(String s) {
        if (s.isEmpty())
            return true;

        Stack<Character> stack = new Stack<>();
        for (char c : s.toCharArray()) {
            if (c == '(')
                stack.push(')');
            else if (c == '[')
                stack.push(']');
            else if (c == '{')
                stack.push('}');
            else if ((stack.empty() || c != stack.pop()))//1.
                return false;
        }
        if (stack.empty()) { //2.
            return true;
        }

        return false;
    }
}
